package myjdbc;

import java.sql.*;

/**
 * @Auther: cty
 * @Date: 2020/1/19 11:22
 * @Description:  JDBC访问MySQL数据库，实现创建数据表、插入多条记录和查询数据表
 * 1 什么是JDBC？
 * （1）JDBC(Java Database Connectivity) Java数据库连接：为java开发者使用数据库提供了统一的编程接口，它由一
 * 组java类和接口组成，是java程序与数据库系统通信的标准API。
 * （2）JDBC API 使得开发人员可以使用纯java的方式来连接数据库，并执行操作。
 * （3）sun公司由于不知道各个主流商用数据库的程序代码，因此无法自己写代码连接各个数据库，因此，sun公司决定，自
 * 己提供一套api，凡是数据库想与Java进行连接的，数据库厂商自己必须实现JDBC这套接口。而数据库厂商的JDBC实现称之
 * 为此数据库的数据库驱动，是一些jar文件。
 *
 * 2 JDBC中的常用接口有哪些？
 * （1）Driver接口——加载数据库驱动
 * （2）DriverManager接口——建立数据库连接，获取连接对象
 * （3）Connection接口——连接对象，用于获取Statement对象
 * （4）Statement接口——用于执行静态 SQL 语句并返回它所生成结果的对象，常用方法有：
 *          execute()：运行语句，返回是否有boolean结果集
 *          executeQuery运行select语句，返回ResultSet结果集，ResultSet接口常用方法有：
 *                                     getString()--varchar、char
 *                                     getFloat()--Float
 *                                     getDate()--Date
 *                                     getBoolean()--Boolean
 *          executeUpdate()：运行insert/update/delete操作，返回更新的int行数
 * （5）ResultSet接口——Statement执行SQL语句时返回ResultSet结果集
 *
 * 3 使用JDBC一般包括哪些步骤？
 * （1）加载MySQL驱动程序
 * （2）获得数据库连接
 * （3）操作数据库
 *          获取Statement对象
 *          执行SQL语句
 * （4）处理返回数据
 * （5）关闭连接
 *
 * 4 如何关闭连接？
 * （1）遵循：ResultSet-->Statement-->Connection这样的关闭顺序
 * （2）将三个try-catch块分开写，这样即使一个关闭异常也不影响其他连接的关闭
 *
 * @version: 1.0
 */
public class JDBC_Demo01_Base {

    public static final String URL = "jdbc:mysql://localhost:3306/testjdbc";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1. 加载MySQL驱动程序
        Class.forName("com.mysql.jdbc.Driver");  // 1
//        //加载Oracle驱动
//        Class.forName("oracle.jdbc.driver.OracleDriver");

        //2. 获得数据库连接
        //连接内部其实包含了一个Socket对象，是一个远程的连接，比较耗时！这是Connection对象管理的一个要点！
        //真正开发中，为了提高效率，都会使用“连接池”来管理连接对象！
        long start = System.currentTimeMillis();
        Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);  // 2
        System.out.println(conn);
        long end = System.currentTimeMillis();
        System.out.println("建立连接耗时："+(end-start)+"ms");

        //3. 操作数据库，实现增删改查
        Statement stmt = conn.createStatement();  // 3.1 获取Statement对象
        //(1) 创建数据表表（DDL）
        String sql = "CREATE TABLE if not exists `user` (\n" +
                "  `id` int(11) NOT NULL AUTO_INCREMENT,\n" +
                "  `username` varchar(30) DEFAULT NULL,\n" +
                "  `pwd` varchar(30) DEFAULT NULL,\n" +
                "  `infoVarchar` varchar(100) DEFAULT NULL,\n" +
                "  `infoClob` text DEFAULT NULL,\n" +
                "  `infoBlob` blob DEFAULT NULL,\n" +
                "  `regDate` date DEFAULT NULL,\n" +
                "  `regTime` time DEFAULT NULL,\n" +
                "  `regTimestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n" +
                "  `randTimestamp` timestamp NULL DEFAULT NULL,\n" +
                "  PRIMARY KEY (`id`)\n" +
                ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8";
        stmt.execute(sql);  // 3.2 执行SQL语句

        //(2) 通过参数传递插入多条记录（DML）
        String name = "张三";
        sql = "insert into user(username,pwd,regTimestamp,infoVarchar) values('"+name+"',333,now(),'我叫张三，今年三岁了。')";
        int rs1 = stmt.executeUpdate(sql);

        sql = "insert into user(username,pwd,regTimestamp,infoVarchar) values('李四',444,now(),'我叫李四，今年四岁了。')";
        int rs2 = stmt.executeUpdate(sql);

        sql = "insert into user(username,pwd,regTimestamp,infoVarchar) values('王五',555,now(),'我叫王五，今年五岁了。')";
        int rs3 = stmt.executeUpdate(sql);

        sql = "insert into user(username,pwd,regTimestamp,infoVarchar) values('赵六',666,now(),'我叫赵六，今年六岁了。')";
        int rs4 = stmt.executeUpdate(sql);

        //(3) 查询数据表（DQL）
        sql = "select * from user";
        ResultSet rs5 = stmt.executeQuery(sql);

        //4. 处理返回数据
        System.out.println("更新了"+(rs1+rs2+rs3+rs4)+"条记录！");

        while (rs5.next()){
            System.out.println("用户名："+rs5.getString("username")+
                    "\t密码："+rs5.getString("pwd")+
                    "\t注册时间："+rs5.getString("regTimestamp")+
                    "\t自我介绍："+rs5.getString("infoVarchar"));
        }

        //5. 关闭连接
        if(rs5!=null){
            rs5.close();
        }
        if(stmt!=null){
            stmt.close();
        }
        if(conn!=null){
            conn.close();
        }
    }
}

/*  res: (运行时间：2020-01-21 21:51:46)
com.mysql.jdbc.JDBC4Connection@7907ec20
建立连接耗时：328ms
更新了4条记录！
用户名：张三	密码：333	注册时间：2020-01-21 21:51:46.0	自我介绍：我叫张三，今年三岁了。
用户名：李四	密码：444	注册时间：2020-01-21 21:51:46.0	自我介绍：我叫李四，今年四岁了。
用户名：王五	密码：555	注册时间：2020-01-21 21:51:46.0	自我介绍：我叫王五，今年五岁了。
用户名：赵六	密码：666	注册时间：2020-01-21 21:51:46.0	自我介绍：我叫赵六，今年六岁了。
*/
